#include <stdio.h>
#include "../quickjs.h"

#define JS_INIT_MODULE js_init_module
#define countof(x) (sizeof(x) / sizeof((x)[0]))

// 接受一个js的数
// 使用JS_ToInt64转换为c的数
// argv[0] -> JS_ToInt64 -> val
static JSValue js_num_to_c(
    JSContext *js_ctx, 
    JSValueConst this_val,
    int argc, JSValueConst *argv
){
    int64_t val;
    if (JS_ToInt64(js_ctx, &val, argv[0])) {
        printf("js_num_to_c: JS_ToInt64 fail\n");
    } else {
        printf("js_num_to_c: JS_ToInt64: %ld\n", val);
    }

    return JS_UNDEFINED;
}
// 返回一个c的数到js
// JS_NewInt64创建一个js的数
// val -> JS_NewInt64 -> jsNum
static JSValue c_num_tojs(
    JSContext *js_ctx, 
    JSValueConst this_val,
    int argc, JSValueConst *argv
)
{
    int64_t val = 1024000;

    return JS_NewInt64(js_ctx, val);
}

// 注册一个函数

// 1 函数列表
static const JSCFunctionListEntry js_test_funcs[] = {
    /* JS_CFUNC_DEF(函数入口名称，入参个数，QuickJS C 函数) */
    JS_CFUNC_DEF("js_num_to_c", 1, js_num_to_c),
    JS_CFUNC_DEF("c_num_tojs", 0, c_num_tojs),
};

// 2 函数注册
static int js_module_init(JSContext *ctx, JSModuleDef *m)
{
    return JS_SetModuleExportList(
        ctx, m, 
        js_test_funcs,countof(js_test_funcs)
    );
}

// 3 模块导出
#define JS_INIT_MODULE js_init_module
JSModuleDef *JS_INIT_MODULE(JSContext *ctx, const char *module_name)
{
    JSModuleDef *m;
    m = JS_NewCModule(ctx, module_name, js_module_init);
    if (!m)
        return NULL;
    JS_AddModuleExportList(ctx, m, js_test_funcs, countof(js_test_funcs));
    return m;
}